package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;


public class Consultation {
	Shell shell = null;
	private Display display = null;
	private final int WIDTH = 772;
	private final int HEIGHT = 772;

	private Label lblVousNtesPas;
	private Button btnSeConnecter,stats,afficher, PasserUneCommande,AjouterUnePhoto;
	private Table table;
	private int idAlbum;
	
	private  int index,TaillePar,TailleTot;
	private  String[] listeAlbum,listePar;	
	private boolean [] isAlbum;
	private Button creation;
	private Button creerL;
	private Button btnInfos;
	private Button btnModifierLalbum;
	
	/**
	 * Constructeur de la classe, initialise uniquement
	 * l'écran à utiliser pour afficher la fenêtre
	 */
	public Consultation(){
		display = MainApp.display;
	}
	
	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(){
		if(shell == null || shell.isDisposed()){
			run();
		}else{
			rafraichir();
			shell.setActive();
		}
	}
	
	/**
	 * Lance la fenêtre et crée les éléments
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){

		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX);		// Crée une fenètre non redimensionnable
		shell.setText("Consultation des Albums");
		shell.setSize(WIDTH, HEIGHT);
		shell.setImage(MainApp.icone);
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		
		btnSeConnecter = new Button(shell, SWT.NONE);
		btnSeConnecter.setBounds(649, 10, 97, 25);
		btnSeConnecter.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseDown(MouseEvent arg0) {
					if(MainApp.idClient == 0)
						MainApp.conn.setActive();
					else
						MainApp.conn.deconnecter();
				}
			});
		
		afficher = new Button(shell, SWT.NONE);
		afficher.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.affAlbum.setActive(idAlbum);
			}
		});
		afficher.setBounds(10, 168, 173, 25);
		afficher.setText("Afficher l'Album");
		afficher.setEnabled(false);
		
		lblVousNtesPas = new Label(shell, SWT.NONE);
		lblVousNtesPas.setAlignment(SWT.RIGHT);
		lblVousNtesPas.setBounds(472, 15, 171, 23);
		
		Label label = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
		label.setBounds(0, 91, shell.getBounds().width-shell.getBorderWidth()*2, 15);
		
		table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				try{
					if (table.getSelectionIndex()!=-1){
						setidAlbum();
						afficher.setEnabled(true);
						
						if (isAlbum[table.getSelectionIndex()])
							afficher.setText("Afficher l'Album");
						else
							afficher.setText("Afficher le Livre");
						
						if(MainApp.idClient!=0)
							btnModifierLalbum.setEnabled(true);
						else
							btnModifierLalbum.setEnabled(false);
						
						if(MainApp.idClient!=0 && isAlbum[table.getSelectionIndex()])
							creerL.setEnabled(true);
						else
							creerL.setEnabled(false);
					}
				}catch(SQLException e){
					MainApp.erreurBase(e.getMessage());
				}	
			}
		});
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		table.setBounds(199, 112, 557, 621);
		
		TableColumn	tblclmnTitre = new TableColumn(table, SWT.NONE);
		tblclmnTitre.setWidth(276);
		tblclmnTitre.setText("Albums et Livres ");

		
		TableColumn tblclmnPartag = new TableColumn(table, SWT.NONE);
		tblclmnPartag.setWidth(276);
		tblclmnPartag.setText("Partagé");
		
		Button btnQuitter = new Button(shell, SWT.NONE);
		btnQuitter.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				System.exit(0);
			}
		});
		btnQuitter.setBounds(10, 10, 132, 25);
		btnQuitter.setText("Quitter");
		
		stats = new Button(shell, SWT.NONE);
		stats.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.stats.setActive();
			}
		});
		stats.setText("Statistiques");
		stats.setBounds(546, 60, 97, 25);
		stats.setVisible(false);
		
		PasserUneCommande = new Button(shell, SWT.NONE);
		PasserUneCommande.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				if (MainApp.idClient != 0)
					MainApp.commander.setActive();
				else{
					MainApp.commander.setActive();
					MainApp.conn.setActive();
				}
			}
		});
		PasserUneCommande.setBounds(151, 10, 163, 25);
		PasserUneCommande.setText("Passer Une Commande");
		
		AjouterUnePhoto = new Button(shell, SWT.NONE);
		AjouterUnePhoto.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.ajouterPhoto.setActive();
			}
		});
		AjouterUnePhoto.setBounds(10, 230, 173, 25);
		AjouterUnePhoto.setText("Ajouter des photos à un album");
		AjouterUnePhoto.setEnabled(false);
		
		creation = new Button(shell, SWT.NONE);
		creation.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.creationA.setActive();
			}
		});
		creation.setBounds(10, 60, 163, 25);
		creation.setText("Créer un nouvel Album");
		creation.setEnabled(false);
		
		creerL = new Button(shell, SWT.NONE);
		creerL.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.creationL.setActive();
			}
		});
		creerL.setBounds(10, 199, 173, 25);
		creerL.setText("Transformer en livre");
		creerL.setEnabled(false);
		
		btnInfos = new Button(shell, SWT.NONE);
		btnInfos.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				MainApp.infosClient.setActive();
			}
		});
		btnInfos.setBounds(649, 60, 97, 25);
		btnInfos.setText("Informations");
		
		btnModifierLalbum = new Button(shell, SWT.NONE);
		btnModifierLalbum.setEnabled(false);
		btnModifierLalbum.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDown(MouseEvent arg0) {
				MainApp.modAlbum.setActive(idAlbum);
			}
		});
		btnModifierLalbum.setBounds(10, 261, 173, 25);
		btnModifierLalbum.setText("Modifier l'album");
		
		rafraichir();
		shell.open();
	}

	/**
	 * Met à jour les données de la fenêtre
	 */
	public void rafraichir(){			
		table.removeAll();
		
		if(MainApp.estAdmin)
			stats.setVisible(true);
		else
			stats.setVisible(false);
		if(MainApp.idClient != 0){
			btnSeConnecter.setText("Déconnexion");
			lblVousNtesPas.setText(MainApp.prenom + " " + MainApp.nom);
			AjouterUnePhoto.setEnabled(true);
			creation.setEnabled(true);
			btnInfos.setEnabled(true);
			try{
				setTailleTot();
				setListeAlbum();
			}catch (SQLException e) {
				MainApp.erreurBase("Impossible de se connecter à la base. \n" + e.getMessage());
			}
			afficher.setEnabled(false);
			creerL.setEnabled(false);
			btnModifierLalbum.setEnabled(false);
			TableItem[] tableItem = new TableItem[index];
			for (int i=0;i<index;i++){
				tableItem[i] = new TableItem(table, SWT.NONE);
				tableItem[i].setText(listeAlbum[i]);
				if (listePar[i].equals("o")){
					tableItem[i].setText(1,"oui");
				}else {
					tableItem[i].setText(1,"non");
				}
				if (!isAlbum[i]) tableItem[i].setFont(SWTResourceManager.getFont(tableItem[i].getFont().toString(), 9, SWT.BOLD));
			}	
		}else{
			btnSeConnecter.setText("Se connecter");
			lblVousNtesPas.setText("Vous n'êtes pas connecté");
			afficher.setEnabled(false);
			creerL.setEnabled(false);
			AjouterUnePhoto.setEnabled(false);
			creation.setEnabled(false);
			btnInfos.setEnabled(false);
			try{
				setTaillePar();
				setListeAlbumPar();
			}catch (SQLException e) {
				MainApp.erreurBase("Impossible de se connecter à la base. \n" + e.getMessage());
			}
			TableItem[] tableItem = new TableItem[index];
			for (int i=0;i<index;i++){
				tableItem[i] = new TableItem(table, SWT.NONE);
				tableItem[i].setText(listeAlbum[i]);
				tableItem[i].setText(1,"oui");
				if (!isAlbum[i]) tableItem[i].setFont(SWTResourceManager.getFont(tableItem[i].getFont().toString(), 9, SWT.BOLD));
			}
		}
	}

	/**
	 * Défini la taille de la table
	 * @throws SQLException
	 */
	public void setTailleTot() throws SQLException{
		Connection conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		Statement stmt = conn.createStatement();
		
		String req = "SELECT count(idAlbum) FROM Album WHERE idClient ="+MainApp.idClient+" OR partage LIKE 'o'" ;
		ResultSet rset = stmt.executeQuery(req);
		while(rset.next()!=false){
			TailleTot = rset.getInt(1);
		}
		rset.close();
		stmt.close();
		conn.commit();
		conn.close();
	}
	
	/**
	 * Défini la taille de la table mais quand l'utilisateur n'est pas connecté
	 * @throws SQLException
	 */
	public void setTaillePar() throws SQLException{
		Connection conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		Statement stmt = conn.createStatement();
		
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		String req = "SELECT COUNT(idAlbum) FROM Album WHERE partage LIKE 'o'";
		ResultSet rset = stmt.executeQuery(req);
		if (rset.next()){
			TaillePar =rset.getInt(1);
		}
		rset.close();
		stmt.close();
		conn.commit();
		conn.close();
	}
	
	/**
	 * Affiche les albums
	 * @throws SQLException
	 */
	public void setListeAlbum() throws SQLException{
		index = 0;

		Connection conn = JDBC.getInstance().getConnection();
		Statement stmt = conn.createStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		String req = "SELECT DISTINCT a.titre,a.partage, l.idAlbum FROM Album a LEFT JOIN Livre l ON a.idAlbum = l.idAlbum WHERE a.idClient="+MainApp.idClient+" OR a.partage LIKE 'o' ORDER BY a.titre ASC" ;
		ResultSet rset = stmt.executeQuery(req);

		listeAlbum=new String[TailleTot];
		listePar=new String[TailleTot];
		isAlbum = new boolean[TailleTot];
		
		while(rset.next()!=false){
			listeAlbum[index]=rset.getString(1);
			listePar[index] = rset.getString(2);
			if (rset.getString(3) != null)
				isAlbum[index] = false;
			else
				isAlbum[index] = true;
			index++;
		}

		rset.close();
		stmt.close();
		conn.commit();
		conn.close();	
	}

	/**
	 * Affiche les albums partagés uniquement
	 * @throws SQLException
	 */
	public void setListeAlbumPar() throws SQLException{
		index = 0;

		Connection conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		Statement stmt = conn.createStatement();
		
		String req = "SELECT DISTINCT a.titre,a.partage,l.idAlbum FROM Album a LEFT JOIN Livre l ON a.idAlbum = l.idAlbum WHERE a.partage LIKE 'o' ORDER BY a.titre ASC" ;
		ResultSet rset = stmt.executeQuery(req);

		listeAlbum=new String[TaillePar];
		isAlbum = new boolean[TaillePar];
		
		while(rset.next()!=false){
			listeAlbum[index]=rset.getString(1);
			if (rset.getString(3) != null)
				isAlbum[index] = false;
			else
				isAlbum[index] = true;
			index++;
		}

		rset.close();
		stmt.close();
		conn.commit();
		conn.close();	
	}
	
	/**
	 * Renvoie l'id de l'album
	 * @throws SQLException
	 */
	public int getidAlbum(){	
		return idAlbum;
	}
	
	/**
	 * Permet de définir l'id de l'album séléctionné.
	 * @throws SQLException
	 */
	public void setidAlbum() throws SQLException{
		TableItem[] itemSelection = table.getSelection();
		Connection conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		Statement stmt = conn.createStatement();

		String req = "SELECT idAlbum FROM Album WHERE titre= '"+itemSelection[0].getText()+"'" ;
		ResultSet rset = stmt.executeQuery(req);

		while(rset.next()!=false){
			idAlbum = rset.getInt(1);
		}
		rset.close();
		stmt.close();
		conn.commit();
		conn.close();
	}
	
	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
}
